package com.hy.Three399;

import java.util.Stack;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:
 * User:Mr.Du
 * Date:2024/5/26
 * Time:11:25
 */
public class CompressedString {

    /**
     * 对给定的字符串进行压缩，如果连续字符的数量不超过9，则直接将字符和数量连在一起，如果超过9，则单独表示数量。
     * @param word 需要进行压缩的字符串
     * @return 压缩后的字符串
     */
    public String compressedString(String word) {
        // 使用栈来存储连续字符
        Stack<Character> st = new Stack<>();
        int n = word.length(), i = 0;
        // 使用StringBuffer来构建最终的压缩字符串
        StringBuffer sb = new StringBuffer();
        // 遍历字符串中的每个字符
        while(i < n){
            char c = word.charAt(i);
            // 如果栈为空，直接将字符压入栈
            if(st.isEmpty()){
                st.push(c);
            }else if(st.peek() == c && st.size() < 9){ // 如果栈顶字符与当前字符相同且栈内字符数量小于9，将字符压入栈
                st.push(c);
            }else if(st.peek() == c && st.size() == 9){ // 如果栈顶字符与当前字符相同且栈内字符数量等于9，将9和字符追加到结果字符串，清空栈后重新压入当前字符
                sb.append(9 + ""+ c);
                st.clear();
                st.push(c);
            }else if(st.peek() != c){ // 如果栈顶字符与当前字符不同，将栈内字符数量和字符追加到结果字符串，清空栈后压入当前字符
                sb.append(st.size() +""+ st.pop());
                st.clear();
                st.push(c);
            }
            i++;
        }
        // 将栈内剩余的字符数量和字符追加到结果字符串
        sb.append(st.size() +""+ st.pop());
        // 返回压缩后的字符串
        return sb.toString();
    }
}
